/* The copyright in this software is being made available under the BSD
* License, included below. This software may be subject to other third party
* and contributor rights, including patent rights, and no such rights are
* granted under this license.
*
* Copyright (c) 2010-2013, ITU/ISO/IEC
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
*  * Redistributions of source code must retain the above copyright notice,
*    this list of conditions and the following disclaimer.
*  * Redistributions in binary form must reproduce the above copyright notice,
*    this list of conditions and the following disclaimer in the documentation
*    and/or other materials provided with the distribution.
*  * Neither the name of the ITU/ISO/IEC nor the names of its contributors may
*    be used to endorse or promote products derived from this software without
*    specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
* THE POSSIBILITY OF SUCH DAMAGE.
*/


/** \file     TComSplitImg.h
*/
#ifndef TCOMSPLITIMG
#define TCOMSPLITIMG

#include "CommonDef.h"
#include "TComPic.h"
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include "TComConvNet.h"

#if CNN_BASED_INLOOP_FILTER
struct BlockInfo
{
  Int blockX;
  Int blockY;
  Int blockHeight;
  Int blockWidth;
  cv::Mat block;
};


class TComSplitImg
{
private:
  Int m_maxBlockWidth;
  Int m_maxBlockHeight;
  Int m_blockNumInHor;
  Int m_blockNumInVer;
public:
  Void splitImg(TComPic* pcPic, std::vector<BlockInfo>&subImg, Int compIdx, TComPicYuv *pcPicYuvRec);
  TComSplitImg(Int maxWidth, Int maxHeight);
  ~TComSplitImg();
  Void picYuv2Mat(TComPic* pcPic, int compIdx, cv::Mat &inputImg, TComPicYuv *pcPicYuvRec);
  Void mat2PicYuv(TComPic* pcPic, int compIdx, cv::Mat &recImg, TComPicYuv *pcPicYuvRec);
  Void postProcess(TComPic* pcPic, TComPicYuv *pcPicYuvRec = NULL
#if frameworkCombine
    ,string platform = DEFAULT_DL_FRAMEWORK
#endif
  );
#if USE_TENSORFLOW
  Void postProcess_tf(TComPic* pcPic, TComPicYuv *pcPicYuvRec = NULL);
#endif
  Void blockCombine(TComPic* pcPic, cv::Mat &recImg, BlockInfo subImg, std::vector<float> result);
};
#endif
#endif

